﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace lp1415_5605
{
    /// <summary>
    /// Classe responsável por mostrar as estatisticas
    /// </summary>
    class PlotStatistics
    {
        /// <summary>
        /// Objecto responsável por aceder aos dados da BD
        /// </summary>
        private GetDataDb dataDB;

        /// <summary>
        /// Constructor da Classe
        /// </summary>
        /// <param name="dataDB">Objecto com o conteudo lido da BD</param>
        public PlotStatistics(GetDataDb dataDB)
        {
            this.dataDB = dataDB;
        }

        /// <summary>
        /// Mostra gráfico com a estatistica de acordo com os parametros de entrada
        /// </summary>
        /// <param name="statName">Nome da Estatisca. (Para mostrar na janela do gráfico como titulo)</param>
        /// <param name="stat">Index da Estatistica. (Coincide com o Index da coluna na BD)</param>
        /// <param name="firstYear">Limite inferior para a intervalo de anos a apresentar</param>
        /// <param name="lastYear">Limite superior para a intervalo de anos a apresentar</param>
        public void getStat(string statName, int stat, int firstYear, int lastYear)
        {
            int[] anos = this.getDataInInterval(firstYear, lastYear, 0);
            int[] dados = this.getDataInInterval(firstYear, lastYear, stat);

            ChartWindows graph = new ChartWindows(statName, anos, dados);
            graph.Show();
        }

        /// <summary>
        /// Mostra gráfico com duas estatisticas de acordo com os parametros de entrada
        /// </summary>
        /// <param name="statName1">Nome da estatistica 1</param>
        /// <param name="statName2">Nome da estatistica 2</param>
        /// <param name="stat1">Index da Estatistica 1. (Coincide com o Index da coluna na BD)</param>
        /// <param name="stat2">Index da Estatistica 2. (Coincide com o Index da coluna na BD)</param>
        /// <param name="firstYear">Limite inferior para a intervalo de anos a apresentar</param>
        /// <param name="lastYear">Limite superior para a intervalo de anos a apresentar</param>
        public void getStat(string statName1, string statName2, int stat1, int stat2, int firstYear, int lastYear)
        {
            int[] anos = this.getDataInInterval(firstYear, lastYear, 0);
            int[] dados_stat1 = this.getDataInInterval(firstYear, lastYear, stat1);
            int[] dados_stat2 = this.getDataInInterval(firstYear, lastYear, stat2);

            ChartWindows graph = new ChartWindows(statName1, statName2, anos, dados_stat1, dados_stat2);
            graph.Show();
        }

        /// <summary>
        /// Devolve um array com os dados dentro do intervalo de anos
        /// </summary>
        /// <param name="firstYear">Limite inferior para a intervalo de anos a apresentar</param>
        /// <param name="lastYear">Limite superior para a intervalo de anos a apresentar</param>
        /// <param name="col">Index da coluna na BD que se pretende obter</param>
        /// <returns></returns>
        private int[] getDataInInterval(int firstYear, int lastYear, int col)
        {
            //A numero de anos a ler é = anoFinal - anoInicial + 1 (+1 para ler entre o intervalo de anos inclusivé)
            int[] result = new int[lastYear - firstYear + 1];

            for (int i = 0; i < result.Length; i++)
            {
                //Caso os anos a ler sejam desde 1977, entao a posicao inicial é igual a 1977 - 1977 = Posição 0
                //Caso os anos a ler sejam desde 2000, entao a posicao iniciaç é igual a 2000 - 1977 = Posição 23
                string data = this.dataDB.table_data[firstYear - 1977 + i][col];

                //Se o campo for vazio, assume o valor de 0, de forma a não provocar Excepção no parse para Double.
                if (data.Equals(""))
                {
                    data = "0";
                }

                //Despresamos as casas decimais para apresentação do gráfico, para termos apenas um tipo de dados (int), já que a diferença é imperceptível no gráfico
                //Desta maneira podemos aproveitar este método para obter Datas(valores inteiros) e os restantes valores(double).
                result[i] = Convert.ToInt32(Double.Parse(data));
            }

            return result;
        }
    }
}
